package leetcode.code0025;

import leetcode.helper.tree.ListNode;

public class Solution extends Solution25 {

	@Override
	public ListNode reverseKGroup(ListNode head, int k) {
		if (k == 1)
			return head;// 已经完成的结果头
		ListNode tail = head;// 已经完成的结果尾部
		ListNode p1 = head;// 当前k段的快针
		ListNode p2 = head;// 快针,先探索k个数,不足就返回,不翻转
		ListNode pt = head;// 当前k段的为
		ListNode ph = head;// 当前k段的头
		boolean flag = true;
		while (true) {
			for (int i = 0; i < k; i++) {//探索k个节点,停在下一段的开始
				if (p2 != null) {
					p2 = p2.next;
				} else {
					return head;//不足k个,返回
				}
			}
			for (int i = 0; i < k - 1; i++) {// k段处理k-1次
				p1 = pt.next;
				pt.next = p1.next;
				p1.next = ph;
				ph = p1;
			}
			if (flag) {
				head = ph;// 第一轮拿到结果
				flag = false;
			}
			tail.next = ph;// 已经完成的tail -> 当前k段完成的头ph
			tail = pt;// tail移动到当前k段完成的尾pt
			ph = p2;// 开始
			pt = p2;// 新的
			p1 = p2;// 一段k处理
			tail.next = ph;// 最后一段头,不翻转先连上,如果需要翻转在line35会重新链接
		}
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();
		so.debug4();
		so.debug5();

	}

}
